package com.shujia.four;

import org.junit.Test;

import java.util.Arrays;
import java.util.Scanner;

public class ArrayDemo2 {
    /*
    增强版for循环也称为foreach循环。相对于之前的普通for循环要简洁一些
    语法格式：
    for(元素类型 元素变量 : 遍历对象 ){
    // 循环体 使用元素变量
    }
    注意：增强for循环在循环体内无法获取遍历元素的索引
    在循环内部要使用索引, 还是要是普通for循环
     */
    @Test
    public void forEachTest() {
        int[] arr = {0, 1, 4, 8, 25, 30};
        //
        for(int num : arr) {
            // num不是下标, 是数组中元素
            System.out.println(num);
        }
    }

    @Test
    public void searchArr1() {
        Scanner sc = new Scanner(System.in);
        // 折半查找
        // 要注意right的初始化值是length – 1;
        // 判断条件为: left <= right; ----left = mid + 1; right = mid – 1;
        int[] arr = {0, 1, 4, 8, 25, 199};
        int num = sc.nextInt();
        int left = 0;// 查询的起始下标
        int right = arr.length - 1;// 查询的末尾下标

        boolean flag = false;//默认不存在
        while (left <= right) {
            int mid = (right + left) / 2;// 索引
            if (num < arr[mid]) {
                right = mid - 1;
            } else if (num > arr[mid]) {
                left = mid + 1;
            } else {
                System.out.println("查找的元素索引为:" + mid);
                // 数字是存在的
                flag = true;
                break;
            }
        }

        if (!flag) {
            System.out.println(-1);
        }

    }

    @Test
    public void searchArr() {
        Scanner sc = new Scanner(System.in);
        int guessNum = sc.nextInt();
        // 数组查找 猜数字游戏：从键盘中任意输入一个, 打印数字在数组中的索引,
        // 如果不存在打印 -1
        int[] arr = {8, 4, 1, 0, 25, 199};
        boolean flag = false;//默认不存在
        for (int i = 0; i < arr.length; i++) {
            if (guessNum == arr[i]) {
                System.out.println(i);
                // 数字是存在的
                flag = true;
                break;
            }
        }
        if (!flag) {
            System.out.println(-1);
        }

    }

    @Test
    public void reverseArr() {
        /*
        有一个数列： 8,4,1,0,25,199,33
        求数列中所有数值的和
        将数组倒置并输出
         */
        int[] arr = {8, 4, 1, 0, 25, 199};
        System.out.println("old:" + Arrays.toString(arr));
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println("sum:" + sum);

        // 将数组倒置并输出 8,4,1,0,25,199,33 -> 33, 199, 25, 0, 1, 4, 8
        // 7 / 2 = 3; i < 3(0, 1, 2), 中间的数字不需要交换
        // 将数组倒置并输出 8,4,1,0,25,199
        // 6 / 2 = 3; i < 3(0, 1, 2), 元素有偶数个, 是没有中间元素

        for (int i = 0; i < arr.length / 2; i++) {
            // arr[0] 和 arr[6]
            // arr[i] 和 arr[arr.length - 1 - i]
            // arr[1] 和 arr[5]
            // arr[i] 和 arr[arr.length - 1 - i]
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
        System.out.println("reverse:" + Arrays.toString(arr));


    }

    @Test
    public void bubbleSort() {
        int[] arr = {5, 8, 6, 3, 9, 2, 1, 7};
        // length = 8
        /*
        第二轮比较的时候, i = 1
        索引的最大值只能是5 -> j < 6; 6 -> length - 1 - i
        第三轮比较的时候, i = 2
        索引的最大值只能是4 -> j < 5; 5 -> length - 1 - i
         */
        System.out.println("排序前的:" + Arrays.toString(arr));
        // 要比较多少轮, i表示我们已经排好序了几个数字
        // 排序好length - 1 数字就可以了, 最后一个不需要排序
        for (int i = 0; i < arr.length - 1; i++) {
            // 循环比较的下标
            for (int j = 0; j < arr.length - 1 - i; j++) {
                // 比较下标的元素和元素后面的值
                if (arr[j] > arr[j + 1]) {
                    // 交换元素
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println("排序后的:" + Arrays.toString(arr));
    }


    @Test
    public void test1() {
        // 获取数组中的最大值
        int[] arr = {11, 22, 55, 77, 100, 33, 88};
        // 最大值默认是第一个元素
        int max = arr[0];
        // 遍历数组, 从第二个开始比较
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("max:" + max);

    }


}
